iT邦幫忙

2024 iThome 鐵人賽

DAY 6
0
生成式 AI

RAG自己來系列:客服機器人系列 第 6

[Day 6] 用 Faiss 搜尋相似資料

  • 分享至 

  • xImage
  •  

Faiss + sqlite

由 Facebook AI Research 團隊在 2018 年 3 月開始在 Github 上活躍,其優點為提供高效算法來快速搜索和聚類詞嵌入向量資料。

上手方式也極其簡單

首先先安裝 Python 套件,官方提供了 faiss-cpu 與 faiss-gpu 兩個不同版本的套件。文字轉向量說實在不是非常繁重的工作,日常使用可以用 faiss-cpu 版本即可

pip install faiss-cpu langchain-community
# pip install faiss-gpu langchain-community

再來就是開始撰寫程式碼讓他去分割我們的文本內容啦,這邊我選擇的內容是開放源碼授權概觀中對不同開源授權的解釋。

from langchain_community.document_loaders import TextLoader
from langchain_community.vectorstores import FAISS
from langchain_community.embeddings import HuggingFaceBgeEmbeddings
from langchain_text_splitters import CharacterTextSplitter

loader = TextLoader("./license.txt")
text_splitter = CharacterTextSplitter(chunk_size=300, chunk_overlap=30)
docs = text_splitter.split_documents(loader.load())
embeddings = HuggingFaceBgeEmbeddings(
    model_name = "sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2",
    model_kwargs = {'device': 'cpu'},
    encode_kwargs = {'normalize_embeddings': True}
)
embed_document = FAISS.from_documents(docs, embeddings)
Line 7: 我們將讀進來的文本字串分割成每段 300 個單位,每個單位都加上前一段的 30 單元的文字
Line 9: 我們使用一個支援多國語言的一個詞嵌入模型,幫我做文字向量化的工作

簡單測試一下,若我們想要詢問有關 "Apache License" 的相關內容

docs = embed_document.similarity_search("Apache License")
print(docs[0].page_content)
"""
重點規則:

散佈時要附上 Apache 2.0 授權
衍生作品不需要開源
專利授權方面允許製造、使用、販售等多種權利
可為使用者提供擔保、支援服務等,但是不得使用其他貢獻者的名義擔保或背書支援服務
明確說明授權不處理商標權
關於 Apache 2.0 與 BSD 的差異可以參考這篇林懿萱著作的《化簡為繁的 Apache-2.0 授權條款》。

MPL 2.0 授權
https://opensource.org/licenses/MPL-2.0
"""

可以看到,使用 Langchain 的字串分割與 Faiss 去做相似度搜尋,成功地搜尋出關於 "Apache License" 的相關授權資訊。

若分割完後要儲存給下一次做相似度搜尋使用,可以使用 sqlite 去儲存我們的文字資料。

import sqlite3
conn = sqlite3.connect("vector.sqlite")
cursor = conn.cursor()
cursor.execute('''
CREATE TABLE IF NOT EXISTS text_segments (
    id INTEGER PRIMARY KEY,
    segment TEXT
)
''')

cursor.executemany('''
INSERT INTO text_segments (segment) VALUES (?)
''', [(segment.page_content,) for segment in docs])

若我們下次要使用同一份文本,就可以透過讀取資料庫的方式去獲取資料,不用重複讀取 txt 文件

from langchain_core.documents import Document

result = cursor.execute('SELECT * FROM text_segments').fetchall()
fetch_data = [Document(page_content=record[1]) for record in result]

embeddings = HuggingFaceBgeEmbeddings(
    model_name = "sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2",
    model_kwargs = {'device': 'cpu'},
    encode_kwargs = {'normalize_embeddings': True}
)
embed_document = FAISS.from_documents(fetch_data, embeddings)

docs = embed_document.similarity_search("Apache License")
print(docs[0].page_content)

參考資料


上一篇
[Day 5] 簡單介紹 Docker
下一篇
[Day 7] 用 Milvus 搜尋相似資料
系列文
RAG自己來系列:客服機器人30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言